# -*- coding: utf-8 -*-
"""
@Time ： 2021/11/30 21:42
@Auth ： Mr. William 1052949192
@Company ：特斯汀学院 @testingedu.com.cn
@Function ：Excel文件的数据驱动运行
"""
import os

import pytest

from common.Excel import get_reader, get_writer
from common.NewExcel import Writer
from keywords.appkeys import App
from keywords.interkeys import Inter
from keywords.webkeys import Web


class Ddt:
    """Excel文件的数据驱动运行类"""

    def __init__(self):
        # 运行的关键字对象
        self.web : Web = None
        # 模块名字
        self.feature = ''
        # 模块功能
        self.cases = []
        # 功能用例
        self.case = []
        # 记录功能下标
        self.c_idx = 0
        # 记录功能名字
        self.casename = ''
        # 记录模块的下标
        self.f_idx = 0

        # 写入文件的对象
        self.writer : Writer = None

    def run_web(self, casepath):
        """运行web网页自动化用例"""
        # 初始化关键字对象
        self.web = Web()

        # 读取Excel用例
        # 打开Excel
        reader = get_reader(casepath)
        # 获取到所有sheet页，存放为一个列表
        sheetname = reader.get_sheets()
        print(sheetname)
        for sheet in sheetname:
            # 设置当前读取的sheet页面
            reader.set_sheet(sheet)
            # 设置报告模块名字
            self.f_idx += 1
            self.feature = sheet
            lines = reader.readline()
            # print(lines)
            for i in range(1, len(lines)):
                # print(lines[i])
                line = lines[i]
                # 这是一个功能
                if len(line[0]) > 1:
                    if self.case:
                        self.cases.append(self.case)

                        # 上一个功能统计完，并且可以执行了
                        if self.cases:
                            self.c_idx += 1
                            # 去执行
                            if self.c_idx == 1:
                                os.rename('./ddt/test_web.py', './ddt/test_web_%d.py' % self.c_idx)
                            else:
                                os.rename('./ddt/test_web_%d.py' % (self.c_idx - 1,),
                                          './ddt/test_web_%d.py' % self.c_idx)

                            self.run_pytest('./ddt/test_web_%d.py' % self.c_idx)

                    print(self.cases)
                    print()

                    self.casename = line[0]

                    # 置空，存放下一个功能用例
                    self.cases = []
                    self.case = []
                # 这是用例
                elif len(line[1]) > 1:
                    if self.case:
                        self.cases.append(self.case)

                    # 置空，存放下一条用例的步骤
                    self.case = []
                    self.case.append(line)
                # 这是步骤
                else:
                    # 把步骤放到用例里面
                    self.case.append(line)

            # 如果是sheet统计完成，把最后一个用例添加进去
            if self.case:
                self.cases.append(self.case)

                # 上一个功能统计完，并且可以执行了
                if self.cases:
                    self.c_idx += 1
                    # 去执行
                    if self.c_idx == 1:
                        os.rename('./ddt/test_web.py', './ddt/test_web_%d.py' % self.c_idx)
                    else:
                        os.rename('./ddt/test_web_%d.py' % (self.c_idx - 1,), './ddt/test_web_%d.py' % self.c_idx)

                    self.run_pytest('./ddt/test_web_%d.py' % self.c_idx)

            print(self.cases)
            print()
            # 置空，存放下一个功能用例
            self.cases = []
            self.case = []

        # 所有用例跑完，把文件名还原
        os.rename('./ddt/test_web_%d.py' % (self.c_idx,), './ddt/test_web.py')

    def run_pytest(self, filename):
        """执行一组功能用例"""
        pytest.main(['-s', filename, '--alluredir', './result'])

    def run_app(self, casepath):
        """运行web网页自动化用例"""
        # 初始化关键字对象
        self.web = App()

        # 读取Excel用例
        # 打开Excel
        reader = get_reader(casepath)
        # 获取到所有sheet页，存放为一个列表
        sheetname = reader.get_sheets()
        print(sheetname)
        for sheet in sheetname:
            # 设置当前读取的sheet页面
            reader.set_sheet(sheet)
            # 设置报告模块名字
            self.f_idx += 1
            self.feature = sheet
            lines = reader.readline()
            # print(lines)
            for i in range(1, len(lines)):
                # print(lines[i])
                line = lines[i]
                # 这是一个功能
                if len(line[0]) > 1:
                    self.casename = line[0]
                    if self.case:
                        self.cases.append(self.case)

                        # 上一个功能统计完，并且可以执行了
                        if self.cases:
                            self.c_idx += 1
                            # 去执行
                            if self.c_idx == 1:
                                os.rename('./ddt/test_app.py', './ddt/test_app_%d.py' % self.c_idx)
                            else:
                                os.rename('./ddt/test_app_%d.py' % (self.c_idx - 1,),
                                          './ddt/test_app_%d.py' % self.c_idx)

                            self.run_pytest('./ddt/test_app_%d.py' % self.c_idx)

                    print(self.cases)
                    print()
                    # 置空，存放下一个功能用例
                    self.cases = []
                    self.case = []
                # 这是用例
                elif len(line[1]) > 1:
                    if self.case:
                        self.cases.append(self.case)

                    # 置空，存放下一条用例的步骤
                    self.case = []
                    self.case.append(line)
                # 这是步骤
                else:
                    # 把步骤放到用例里面
                    self.case.append(line)

            # 如果是sheet统计完成，把最后一个用例添加进去
            if self.case:
                self.cases.append(self.case)

                # 上一个功能统计完，并且可以执行了
                if self.cases:
                    self.c_idx += 1
                    # 去执行
                    if self.c_idx == 1:
                        os.rename('./ddt/test_app.py', './ddt/test_app_%d.py' % self.c_idx)
                    else:
                        os.rename('./ddt/test_app_%d.py' % (self.c_idx - 1,), './ddt/test_app_%d.py' % self.c_idx)

                    self.run_pytest('./ddt/test_app_%d.py' % self.c_idx)

            print(self.cases)
            print()
            # 置空，存放下一个功能用例
            self.cases = []
            self.case = []

        # 所有用例跑完，把文件名还原
        os.rename('./ddt/test_app_%d.py' % (self.c_idx,), './ddt/test_app.py')

    def run_inter(self, casepath,resultpath):
        """运行web网页自动化用例"""
        # 初始化关键字对象
        self.web = Inter()

        # 读取Excel用例
        # 打开Excel
        reader = get_reader(casepath)
        self.writer = get_writer(casepath,resultpath)
        # 获取到所有sheet页，存放为一个列表
        sheetname = reader.get_sheets()
        print(sheetname)
        for sheet in sheetname:
            # 设置当前读取的sheet页面
            reader.set_sheet(sheet)
            self.writer.set_sheet(sheet)
            # 设置报告模块名字
            self.f_idx += 1
            self.feature = sheet
            lines = reader.readline()
            # print(lines)
            for i in range(1, len(lines)):
                # print(lines[i])
                line = lines[i]
                # 这是一个功能
                if len(line[0]) > 1:
                    self.casename = line[0]
                    if self.case:
                        self.cases.append(self.case)

                        # 上一个功能统计完，并且可以执行了
                        if self.cases:
                            self.c_idx += 1
                            # 去执行
                            if self.c_idx == 1:
                                os.rename('./ddt/test_inter.py', './ddt/test_inter_%d.py' % self.c_idx)
                            else:
                                os.rename('./ddt/test_inter_%d.py' % (self.c_idx - 1,),
                                          './ddt/test_inter_%d.py' % self.c_idx)

                            self.run_pytest('./ddt/test_inter_%d.py' % self.c_idx)

                    print(self.cases)
                    print()
                    # 置空，存放下一个功能用例
                    self.cases = []
                    self.case = []
                # 这是用例
                elif len(line[1]) > 1:
                    if self.case:
                        self.cases.append(self.case)

                    # 置空，存放下一条用例的步骤
                    self.case = []
                    self.case.append(line)
                # 这是步骤
                else:
                    # 把步骤放到用例里面
                    self.case.append(line)

            # 如果是sheet统计完成，把最后一个用例添加进去
            if self.case:
                self.cases.append(self.case)

                # 上一个功能统计完，并且可以执行了
                if self.cases:
                    self.c_idx += 1
                    # 去执行
                    if self.c_idx == 1:
                        os.rename('./ddt/test_inter.py', './ddt/test_inter_%d.py' % self.c_idx)
                    else:
                        os.rename('./ddt/test_inter_%d.py' % (self.c_idx - 1,), './ddt/test_inter_%d.py' % self.c_idx)

                    self.run_pytest('./ddt/test_inter_%d.py' % self.c_idx)

            print(self.cases)
            print()
            # 置空，存放下一个功能用例
            self.cases = []
            self.case = []

        # 所有用例跑完，把文件名还原
        os.rename('./ddt/test_inter_%d.py' % (self.c_idx,), './ddt/test_inter.py')
        self.writer.save_close()

ddt = Ddt()
